/*
 * 项目名称:    WeChatRobot
 * 创建人员:    DongPeng
 * 创建时间:    2022-12-02
 * copyright(c) 2022 无锡星际智慧物流有限公司
 */
package system;

import cn.hutool.core.swing.clipboard.ImageSelection;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;

import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.KeyEvent;
import java.util.concurrent.TimeUnit;


/**
 * 静态
 *
 * @author DongPeng
 * @version 1.0.0
 * @date 2022-12-02
 * @description
 */
public class RobotUtil {

    private static Robot robot;
    private static Clipboard clip;
    private static Toolkit kit;


    public static void runRobotText(String toName, String text, Long count, Long interval) throws AWTException, InterruptedException {
        // 微信窗口置顶成功
        if (RobotUtil.topWeChat()) {
            // 初始化
            init();
            // 指定需要发送消息的联系人/群组
            RobotUtil.queryItemForSendMessage(toName); // 微信昵称/群名
            // 发送字符串消息
            for (int i = 0; i < count; i++) { // 循环发信息
                TimeUnit.MILLISECONDS.sleep(interval);
                RobotUtil.sendStrMessage(text);
            }
        }
    }

    public static void runRobotImage(String toName, String text, Long count, Long interval) throws AWTException, InterruptedException {
        // 微信窗口置顶成功
        if (RobotUtil.topWeChat()) {
            // 初始化
            init();
            // 指定需要发送消息的联系人/群组
            RobotUtil.queryItemForSendMessage(toName); // 微信昵称/群名
            // 发送字符串消息
            for (int i = 0; i < count; i++) { // 循环发信息
                TimeUnit.MILLISECONDS.sleep(interval);
                // 发送图片消息
                sendImgMessage(text);
            }
        }
    }

    /**
     * 初始化全局变量
     */
    private static void init() {
        try {
            robot = new Robot();
        } catch (AWTException e) {
            robot = null;
            e.printStackTrace();
        }
        kit = Toolkit.getDefaultToolkit();
        clip = kit.getSystemClipboard();
    }

    /**
     * 置顶微信窗口
     *
     * @return
     */
    public static boolean topWeChat() {
        boolean flag = true;
        WinDef.HWND hwnd = User32.INSTANCE.FindWindow(null, "微信");
        if (hwnd == null) {
            flag = false;
            System.out.println("not running");
        } else {
            User32.INSTANCE.ShowWindow(hwnd, 9);
            User32.INSTANCE.SetForegroundWindow(hwnd); // bring to front
        }
        return flag;
    }


    /**
     * 查找需要发送消息的人员/群组
     *
     * @param itemName
     */
    public static void queryItemForSendMessage(String itemName) {
        if (robot == null) {
            return;
        }
        robot.delay(2000); // 给窗口置顶预留时间
        // 模拟在微信上进行Ctrl+F进行查询操作
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_F);
        robot.keyRelease(KeyEvent.VK_CONTROL); // 是否Ctrl键
        // 将字符串放到剪切板内，相当于做了一次复制操作
        Transferable tText = new StringSelection(itemName);
        clip.setContents(tText, null);
        // 以下两行按下了ctrl+v，完成粘贴功能
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_V);

        robot.keyRelease(KeyEvent.VK_CONTROL);// 释放ctrl按键，像ctrl，退格键，删除键这样的功能性按键，在按下后一定要释放，不然会出问题。crtl如果按住没有释放，在按其他字母按键是，敲出来的回事ctrl的快捷键。
        robot.keyPress(KeyEvent.VK_ENTER); // 按下enter键进行查询
        robot.delay(2000); // 预留查询时间
        robot.keyPress(KeyEvent.VK_ENTER); // 再次按下enter键进行选中
        robot.delay(1000);
    }

    /**
     * 发送字符串消息
     *
     * @param message
     */
    public static void sendStrMessage(String message) {
        if (robot == null) {
            return;
        }
        // 将字符串放到剪切板内，相当于做了一次复制操作
        Transferable tText = new StringSelection(message);
        clip.setContents(tText, null);
        // 以下两行按下了ctrl+v，完成粘贴功能
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_V);

        robot.keyRelease(KeyEvent.VK_CONTROL);// 释放ctrl按键，像ctrl，退格键，删除键这样的功能性按键，在按下后一定要释放，不然会出问题。crtl如果按住没有释放，在按其他字母按键是，敲出来的回事ctrl的快捷键。
        robot.keyPress(KeyEvent.VK_ENTER); // 按下enter键进行消息发送
        robot.delay(1000);
    }

    /**
     * 发送字符串消息
     *
     * @param imgPath
     */
    public static void sendImgMessage(String imgPath) {
        if (robot == null) {
            return;
        }
        // 将字符串放到剪切板内，相当于做了一次复制操作
        Transferable tImg = new ImageSelection(kit.getImage(imgPath));
        clip.setContents(tImg, null);
        // 以下两行按下了ctrl+v，完成粘贴功能
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_V);

        robot.keyRelease(KeyEvent.VK_CONTROL);// 释放ctrl按键，像ctrl，退格键，删除键这样的功能性按键，在按下后一定要释放，不然会出问题。crtl如果按住没有释放，在按其他字母按键是，敲出来的回事ctrl的快捷键。
        robot.keyPress(KeyEvent.VK_ENTER); // 按下enter键进行消息发送
        robot.delay(1000);
    }

}

